Containers as a Service ( CaaS ) - 容器如同服務
Docker 是一個開源專案,出現於 2013 年初,最初是 Dotcloud 公司內部的 Side-Project。
它基於 Google 公司推出的 Go 語言實作。( Dotcloud 公司後來改名為 Docker )
1982年Unix系統內建的chroot機制
LXC 利用controler groups 與namespaces的功能, 提供應用軟體一個獨立的作業系統環境
2013 Linux之父Linus Torvalds 發布Linux核心3.8版 支援Container技術
2013 dotCloud公司將內部專案Docker開源釋出程式碼
docker --help
官方文件 Get started with Docker for Mac
官方官方 Get started with Docker for Windows
Docker Toolbox overview
指令 | 說明 | 範例 |
---|---|---|
search | 搜尋 | docker search centos |
pull | 下載 | docker pull centos |
images | 列表 | docker images |
run | 執行 | docker run -ti centos /bin/bash |
rmi [Image ID] | 刪除 | docker rmi 615cb40d5d19 |
build | 建立 | docker build -t member:1 . |
login | 登入 | docker login docker.okborn.com |
push | 上傳 | docker push |
docker search contos
NAME:映像檔名稱
DESCRIPTION:映像檔描述
STARS:越多代表越多人使用
OFFICIAL:官方Image
AUTOMATED:自動化
docker iamges
REPOSITORY:倉庫位置和映像檔名稱
TAG:映像檔標籤(通常是定義版本號)
IMAGE ID:映像檔ID(唯一碼)
CREATED:創建日期
SIZE:映像檔大小
docker run -ti centos /bin/bash
run : 參數說明 or docker run --help 常用:
-i :則讓容器的標準輸入保持打開
-t:讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上
-d:背景執行
-e:設定環境變數(AAA=BBB)
-p:Port 對應(host port:container port)
-v:資料對應(host folder:container folder)
--name:設定容器名稱
** 在執行RUN 映像檔時,如果沒有下載會先下載在執行 **
rmi : 刪除映像檔前要先移除所有Container
build : 使用build 指令時要先切換到Dockerfile 目錄下面
指令 | 說明 | 範例 |
---|---|---|
run | 新建或啟動 | docker run -d centos |
start [Contain ID] | 啟動 | docker start a469b9226fc8 |
stop [Contain ID] | 停止 | docker stop a469b9226fc8 |
rm [Contain ID] | 刪除 | docker rm a4 |
ps -a | 列表 | docker ps -a |
logs [Contain ID] | 查看容器內的資訊 | docker logs -f a4 |
exec [Contain ID] | 進入容器(開新console) | docker exec -ti a4 /bin/bash |
attach | 進入容器(退出停止容器) | dockr attach a4 |
inspect | 查看 | docker inspect a4 |
docker run centos ping google.com
docker ps
docker ps -a
ps : 參數說明 or docker ps --help 常用:
-a:顯示全部的容器
CONTAINER ID:容器ID
IMAGE:映像檔名稱
COMMAND:執行指令
CREATED:創建時間
STATUS:容器狀態
POSTS:開啟的Port號
NAMES:容器名稱
docker logs -f 8a
logs : 參數說明 or docker logs --help 常用:
-f:不會跳出,會一直列印最新的log資訊
docker exec -ti 8a /bin/bash
exec : 參數說明 or docker exec --help 常用:
-i :則讓容器的標準輸入保持打開
-t:讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上
-e:設定環境變數(AAA=BBB)
docker inspect 8a
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
db0e9dbb150596a3a89db056d0ecb765c54c3c2fb5d428e3b35fc20b55813862
docker logs -f db
docker ps -a
docker stop db
docker ps -a
指令 | 說明 | 範例 |
---|---|---|
commit | 容器存檔 | docker commit db aaa:v1 |
pull | 下載 | docker pull docker.okborn.com/okborn:base |
tag | 標籤 | docker tag aaa docker.okborn.com/aaa |
push | 上傳 | docker push docker.okborn.com/member:1 |
login | 登入 | docker login docker.okborn.com |
export | 匯出 | docker export 7691a814370e > ubuntu.tar |
import | 匯入 | cat ubuntu.tar sudo docker import - test/ubuntu:v1.0 |
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
96ea2a3f99e92ddd5fa0ec29f21d035703b6512f59c4f54fbaee551ee8fc044a
docker commit 96 aaa:v1
docker tag centos aaa asia.gcr.io/joyi-205504/aaa:v1
gcloud docker -- push asia.gcr.io/joyi-205504/aaa:v1
刪除
docker rmi `docker images|grep sele |awk '{print $3}'`
docker run -d -P --name web -v /webapp training/webapp python app.py
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
持續更新的資料需要在容器之間共享,最好建立資料卷容器。
一個正常的容器,專門用來提供資料卷供其它容器掛載的。
docker run -d -v /dbdata --name dbdata postgres echo Data-only container for postgres
docker run -d -P --volumes-from dbdata --name db1 postgres
docker run -d -P --volumes-from dbdata --name db2 postgres
docker run -d --name db3 --volumes-from db1 postgres
首先使用 --volumes-from 標記來建立一個載入 dbdata 容器卷的容器,並從本地主機掛載當前到容器的 /backup 目錄。
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
恢復資料到一個容器,首先建立一個帶有資料卷的容器 dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然後建立另一個容器,掛載 dbdata2 的容器,並使用 untar 解壓備份檔案到掛載的容器卷中。
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# 基本映像檔,必須是第一個指令
FROM ubuntu
# 維護者: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com
# 更新映像檔的指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 建立新容器時要執行的指令
CMD /usr/sbin/nginx
####Dockerfile 基本語法
指令 | 說明 | 範例 |
---|---|---|
FROM : | 映像檔來源 | FROM python:3.5 |
MAINTAINER | 維護者訊息 | MAINTAINER docker_user docker_user@email.com |
RUN | 創建映像檔時執行動作 | RUN apt-get -y update && apt-get install -y supervisor |
RUN ["executable", "param1", "param2"] | 創建映像檔時執行動作 | RUN ["/bin/bash", "-c", "echo hello"] |
CMD command param1 param2 | 啟動容器時執行的命令 | CMD pserve development.ini |
CMD ["executable","param1","param2"] | 啟動容器時執行的命令 | |
CMD ["param1","param2"] | 啟動容器時執行的命令 | |
EXPOSE | 容器對外的埠號 | EXPOSE 8082 |
ADD | 複製檔案(單檔) | ADD requirements.txt /usr/src/app/ |
COPY | 複製檔案(資料夾) | COPY . /usr/src/app |
ENV | 環境變數 | ENV PG_VERSION 9.3.4 |
ENTRYPOINT command param1 param2 | 指定容器啟動後執行的命令 | |
ENTRYPOINT ["executable", "param1", "param2"] | 指定容器啟動後執行的命令 | ENTRYPOINT ["/docker-entrypoint.sh"] |
VOLUME ["/data"] | 掛載資料卷 | VOLUME /var/lib/postgresql/data |
USER daemon | 指定運行使用者 | RUN groupadd -r postgres && useradd -r -g postgres postgres |
WORKDIR /path/to/workdir | 指定工作目錄 | WORKDIR /usr/src/app |
ONBUILD [INSTRUCTION] | 基底映像檔建立時執行 | ONBUILD COPY . /usr/src/app |
RUN 當命令較長時可以使用 \ 來換行。
RUN : 在 shell 終端中運行命令,即 /bin/sh -c;
RUN ["executable", "param1", "param2"] : 使用 exec 執行。
CMD 指定啟動容器時執行的命令, 每個 Dockerfile 只能有一條 CMD 命令 。
如果指定了多條命令,只有最後一條會被執行。
CMD ["executable","param1","param2"] 使用 exec 執行,推薦使用;
CMD command param1 param2 在 /bin/sh 中執行,使用在給需要互動的指令;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的預設參數;
ENTRYPOINT:每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個會生效。
USER:要臨時取得管理員權限可以使用 gosu,而不推薦 sudo。
WORKDIR:可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑
# 映像檔Image
FROM python:3.5
# 維護者
MAINTAINER Pellok "pellok@double-cash.com"
# 更新
RUN apt-get -y update && apt-get install -y supervisor
# 創建專案資料夾
RUN mkdir -p /usr/src/app
# 指定工作目錄在專案資料夾
WORKDIR /usr/src/app
# 預先要安裝的requirements複製到Docker裡面
ADD requirements.txt /usr/src/app/
# 安裝需要用的插件
RUN pip install --upgrade pip setuptools
RUN pip install --no-cache-dir -r requirements.txt
# 下次Build 的時候複製專案目錄到Docker 裡面
ONBUILD COPY . /usr/src/app
建置
docker build -t sample:base .
# 挑選Image
FROM sample:base
# 安裝cryptography
RUN pip install cryptography
# 設定工作目錄
WORKDIR /usr/src/app/
# 執行Python Setup
RUN python setup.py develop
# 開啟Port號
EXPOSE 8082
# 執行專案
CMD pserve development.ini
建置
docker build -t project:v1 .
#創建一個新專案
pcreate -s alchemy pyramid_dockerlize
cd pyramid_dockerlize
# 創建dockerfile
touch Dockerfile
# 編輯 Dockerfile
# 建置映像檔
docker build -t pyramid_dockerlize .
# 執行容器
docker run -d -P pyramid_dockerlize
Dockerfile
# This dockerfile uses the python pyramid
# VERSION 1 - EDITION 1
# Author: pellok
# Command describe
# 使用的python映像檔版本
FROM python:3.5
MAINTAINER pellok pellok@okborn.com
# 創建存放專案的資料夾
RUN mkdir -p /usr/src/app
# 複製當前目錄的所有檔案到容器內的,資料放在/usr/src/app
COPY . /usr/src/app
# 指定工作目錄
WORKDIR /usr/src/app/
# 安裝環境變數和相依性套件
RUN python setup.py develop
# 初始化DB
RUN initialize_pyramid_dockerlize_db development.ini
# 專案監聽的Port號
EXPOSE 6543
# 啟動專案
CMD pserve production.ini
VM-for-Devops
Virtual Box [VirtualBox5.1.8][Extension Pack]
Vagrant[Vagrant1.8.7]
kubernetes
minikube
感謝分享,好清楚!
我最近也有在學習Docker,有興趣的話可以一起交流:)
教學-如何建立與使用Docker image
教學-Docker-如何在不同作業系統上使用 觀念解說
教學-Docker-基本架構概念教學
用圖片輕鬆學Docker
文中有錯誤:
顯示目前本機的 Images 列表
docker iamges
應該改為:
docker images
感謝回報!
覺得這篇文章寫得很好,我剛剛也看到一篇深入介紹 Docker 概念的文章。這裡分享給大家 Docker 是什麼?Docker 基本觀念介紹與容器和虛擬機的比較